#include "Util.hpp"
#include "Config.hpp"
#include "Data.hpp"
#include "Hot.hpp"
#include "Server.hpp"
#include <thread>
void FileUtiltest(const string &str)
{
    string centent = str;
    Cloud::FileUtil fileutil(centent);

    fileutil.CreateDirectory();
    vector<string> array;
    fileutil.ScanDirectory(&array);
    for (auto &e : array)
    {
        cout << e << endl;
    }
}
void JsonUtiltest()
{
    Json::Value root;
    const char *name = "小明";
    int age = 18;
    float score[] = {93.5, 88, 79};
    root["姓名"] = name;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);
    string str;
    Cloud::JsonUtil::Serialize(root, &str);
    cout << str << endl;

    Json::Value val;
    Cloud::JsonUtil::UnSerialize(str, &val);
    cout << val["姓名"].asString() << endl;
    cout << val["年龄"].asInt() << endl;
    for (int i = 0; i < val["成绩"].size(); i++)
    {
        cout << val["成绩"][i].asFloat() << endl;
    }
}
void ConfigTest()
{
    Cloud::Config *config = Cloud::Config::GetInstance();
    cout << config->GetHotTiem() << endl;
    cout << config->GetServerPort() << endl;
    cout << config->GetServerIp() << endl;
    cout << config->GetPackFileSuffix() << endl;
    cout << config->GetDownLoadprefix() << endl;
    cout << config->GetBackDir() << endl;
    cout << config->GetPackDir() << endl;
    cout << config->GetBackUpFile() << endl;
}

void DataTest(const string &filename)
{
    // Cloud::BackupInfo Info(filename);
    // cout << Info.fsize << endl;
    // cout << Info.atime << endl;
    // cout << Info.mtime << endl;
    // cout << Info.realpath << endl;
    // cout << Info.packpath << endl;
    // cout << Info.pack_flag << endl;
    // cout << Info.url << endl;

    // cout << "----------------------------------" << endl;

    // Cloud::DataManger data;
    // data.Insert(Info);
    // Cloud::BackupInfo tmp;
    // data.GetOneByUrl("/download/bundle.h", &tmp);
    // cout << tmp.fsize << endl;
    // cout << tmp.atime << endl;
    // cout << tmp.mtime << endl;
    // cout << tmp.realpath << endl;
    // cout << tmp.packpath << endl;
    // cout << tmp.pack_flag << endl;
    // cout << tmp.url << endl;

    // cout << "----------------------------------" << endl;

    // tmp.pack_flag = true;
    // data.Update(tmp);
    // data.GetOneByRealpath(filename, &tmp);
    // cout << tmp.fsize << endl;
    // cout << tmp.atime << endl;
    // cout << tmp.mtime << endl;
    // cout << tmp.realpath << endl;
    // cout << tmp.packpath << endl;
    // cout << tmp.pack_flag << endl;
    // cout << tmp.url << endl;

    // cout << "----------------------------------" << endl;

    // vector<Cloud::BackupInfo> array;
    // data.GetAll(&array);
    // for (auto &e : array)
    // {
    //     cout << e.fsize << endl;
    //     cout << e.atime << endl;
    //     cout << e.mtime << endl;
    //     cout << e.realpath << endl;
    //     cout << e.packpath << endl;
    //     cout << e.pack_flag << endl;
    //     cout << e.url << endl;
    // }
    Cloud::DataManger data;
    vector<Cloud::BackupInfo> array;
    data.GetAll(&array);
    for (auto &e : array)
    {
        cout << e.fsize << endl;
        cout << e.atime << endl;
        cout << e.mtime << endl;
        cout << e.realpath << endl;
        cout << e.packpath << endl;
        cout << e.pack_flag << endl;
        cout << e.url << endl;
    }
}

Cloud::DataManger *data;
void HotTest()
{

    Cloud::HotManger hot;
    hot.RunModule();
}
void ServerTest()
{

    Cloud::Server server;
    server.RunModule();
}

int main(int argc, char *argv[])
{
    // if (argc < 2)
    // {
    //     std::cout << "缺少目标文件" << endl;
    //     return -1;
    // }
    // FileUtiltest(argv[1]);
    // JsonUtiltest();
    // ConfigTest();
    // DataTest(argv[1]);
    // HotTest();
    data = new Cloud::DataManger;
    thread HotManger(HotTest);
    thread Server(ServerTest);
    HotManger.join();
    Server.join();

    return 0;
}